package hxy.bytecode.algorithm;

public class 链表相加 {

	//本例中采用头结点
	
	public static void main(String[] args) {
		
		int a[] = new int[]{5,1 };
		int b[] = { 5 };
		
		ListNode l1 = new ListNode(9);
		ListNode l2 = new ListNode(9);
		for (int i = 0; i < a.length; i++) {
			ListNode temp = new ListNode(a[i]);
			// 头插法
			temp.next = l1.next;
			l1.next = temp;
		}
		for (int i = 0; i < b.length; i++) {
			ListNode temp = new ListNode(b[i]);
			temp.next = l2.next;
			l2.next = temp;
		}

		Solution solution = new Solution();
		ListNode result = solution.addTwoNumbers(l1, l2);

		while (result.next != null) {
			System.out.print(result.next.val);
			result = result.next;
		}
	}
}

// 定义的链表
class ListNode {
	int val;
	ListNode next;

	ListNode(int x) {
		val = x;
	}
}

class Solution {
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		/*
		ListNode l1a=l1;
		while(l1a.next!=null){
			System.out.println("遍历后的值："+l1a.next.val);
			l1a=l1a.next;
		}*/
		// 思路1：把链表数组直接转成数字相加即可得到答案，这个肯定不是面试想要的答案
		// 思路2，使用迭代方式，利用加减的最基本运算方式得到结果
		int jinwei = 0;
		// 长度未知，只能依据传进来的参数做判断。
		ListNode sum = new ListNode(0);
		while (l1.next != null || l2.next != null) {
			//突破口在这里，首先肯定是从低位往高位运算
			if(l1.next==null){
				l1.next=new ListNode(0);
			}else if (l2.next==null) {
				l2.next=new ListNode(0);
			}
			ListNode p = new ListNode((l1.next.val + l2.next.val + jinwei) % 10);
			jinwei = (l1.next.val + l2.next.val + jinwei) / 10;
			// 头插法，如果要求尾插法，并且没有头结点！则需要自己制造一个头结点。利用flag标记，第一个值作为开始结点的值
			p.next=sum.next;
			sum.next = p;
			l1 = l1.next;
			l2 = l2.next;
		}
		if(jinwei!=0){
			ListNode p = new ListNode(jinwei);
			p.next=sum.next;
			sum.next=p;
		}
		return sum;
	}
}
